package common

import (
	"fmt"
	"log/slog"
	"time"
	"trader/apps/common/resp"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/golang-jwt/jwt/v5"
)

func DebugMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		slog.Debug(fmt.Sprintf("%s %s?%s", c.Request.Method, c.Request.URL.Path, c.Request.URL.RawQuery))
		c.Next()
	}
}

// 路由白名单
var whiteRouter = map[string]struct{}{
	"/ping":              {},
	"/api/user/login":    {},
	"/api/user/register": {},
}

// JWTAuthMiddleware JWT认证中间件
func JWTAuthMiddleware() gin.HandlerFunc {
	slog.Debug("注册中间件：JWTAuthMiddleware")
	return func(c *gin.Context) {
		if _, ok := whiteRouter[c.FullPath()]; ok {
			c.Next()
			return
		}

		// 从请求头获取token
		tokenString := c.GetHeader("Authorization")
		if tokenString == "" {
			resp.FailAuth(c, fmt.Errorf("未提供认证Token"))
			c.Abort()
			return
		}
		// 解析token
		token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
			return []byte(JwtSignKey), nil
		})
		if err != nil {
			resp.FailAuth(c, fmt.Errorf("无效的Token"))
			c.Abort()
			return
		}
		// 验证claims
		if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
			// 将用户信息存入context
			c.Set("userId", claims.UserId)
			c.Set("username", claims.Username)
			c.Next()
		} else {
			resp.FailAuth(c, fmt.Errorf("无效的Token"))
			c.Abort()
		}
	}
}

// CorsMiddleware
// 浏览器将请求分为两类：
//   - 简单请求（不会触发预检）：
//     方法：GET、HEAD、POST
//     Content-Type：text/plain、multipart/form-data、application/x-www-form-urlencoded
//     没有自定义头部
//   - 非简单请求（会触发预检）：
//     方法：PUT、DELETE 等
//     Content-Type：application/json
//     有自定义头部（如 Authorization、X-* 等）
func CorsMiddleware() gin.HandlerFunc {
	slog.Debug("注册中间件：CorsMiddleware")
	return cors.New(cors.Config{
		AllowAllOrigins: true,
		AllowHeaders:    []string{"Authorization"},
		MaxAge:          12 * time.Hour,
	})
}
